//多机调度问题: 
某工厂有n个独立的作业，由m台相同的机器进行加工处理。作业i所需的加工时间为ti，任何作业在被处理时不能中
断，也不能进行拆分处理。现厂长请你给他写一个程序：算出n个作业由m台机器加工处理的最短时间
输入
第一行T（1<T<100)表示有T组测试数据。每组测试数据的第一行分别是整数n，m（1<=n<=10000，
1<=m<=100），接下来的一行是n个整数ti（1<=t<=100)。

bool cmp(const int& x, const int& y) 
{ 
    return x > y; 
}
int findMax(const vector<int>& machines) 
{
    int ret = machines[0];
    for (const auto& cur : machines) 
    {
        if (ret < cur)
            ret = cur;
    }
    return ret;
}
int greedStrategy(const vector<int>& works, vector<int>& machines) 
{
    // 按作业时间从大到小排序
    sort(works.begin(), works.end(), cmp);
    int workNum = works.size();
    int machineNum = machines.size();
    // 作业数如果小于机器数，直接返回最大的作业时间
    if (workNum <= machineNum) 
    {
        int minimalTime = works[0];
        return minimalTime;
    } 
    else 
    {
        // 为每一个作业选择机器
        for (int i = 0; i < workNum; i++) 
        {
            // 选择最小的机器
            int flag = 0;
            // 首先假设用第一个机器处理
            int tmp = machines[flag];
            // 从剩余机器中选择作业时间最小的
            for (int j = 1; j < machines.size(); j++) 
            {
                if (tmp > machines[j]) 
                {
                    flag = j;
                    tmp = machines[j];
                }
            }
            // 将当前作业交给最小的机器执行
            machines[flag] += works[i];
        }
        // 从所有机器中选出最后执行完作业的机器
        int minimalTime = findMax(machines);
        return minimalTime;
    }
}
int main() 
{
    int n, m;
    cout << "请输入作业数和机器数" << endl;
    cin >> n >> m;
    vector<int> works(n);
    vector<int> machines(m, 0);
    for (int i = 0; i < n; ++i)
        cin >> works[i];
    cout << greedStrategy(works, machines) << endl;
    return 0;
}